<!DOCTYPE html>
<html lang=''>

<head>
    <meta charset='UTF-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>Document</title>
    <script src='./vue.js'></script>
</head>

<body>
    <div id='app'>
        <async-box></async-box>
    </div>
</body>
<script>
    const app = Vue.createApp({
        data () {
            return {}
        },
    })
    /*
        异步组件，是针对一些不太确定什么时候可以获取到的组件可以使用异步组件
        如一个组件是从服务器请求获取到的组件，那么该组件我们不能 确定他什么时候
        可以获取成功，不知道什么时候可以显示，那么我们就可以使用异步组件，在请求
        成功后返回即可
    
    */

    // Vue.defineAsyncComponent 用来定义一个异步组件用的
    app.component('async-box', Vue.defineAsyncComponent(() => {

        //  创建一个 异步组件
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                // 组件模板
                // 假设该组件模板来源于服务器
                const res = `<div> 从服务器获取到的组件 </div>`

                resolve({
                    template: res,
                    data () {
                        return {

                        }
                    },
                })
                if (!res) {
                    reject({
                        template: '<div> 404 </div>'
                    })
                }
            }, 3000)
        })
    }))


    app.mount('#app')
</script>

</html>